package cn.itsource.hrm.service.impl;

import cn.itsource.hrm.constant.EmployeeConstant;
import cn.itsource.hrm.constant.LoginUserConstant;
import cn.itsource.hrm.constant.TenantConstant;
import cn.itsource.hrm.domain.Employee;
import cn.itsource.hrm.domain.LoginUser;
import cn.itsource.hrm.domain.Tenant;
import cn.itsource.hrm.domain.TenantType;
import cn.itsource.hrm.dto.TenantRegsigterDto;
import cn.itsource.hrm.feign.ILoginUserClient;
import cn.itsource.hrm.mapper.EmployeeMapper;
import cn.itsource.hrm.mapper.TenantMapper;
import cn.itsource.hrm.query.TenantQuery;
import cn.itsource.hrm.service.ITenantService;
import cn.itsource.hrm.util.AjaxResult;
import cn.itsource.hrm.util.PageList;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import io.seata.spring.annotation.GlobalTransactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author yyx
 * @since 2021-10-27
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {



    @Autowired
    private TenantMapper tenantMapper;


    /**
     * 使用feign来调用auth模块的接口。
     */
    @Autowired
    private ILoginUserClient loginUserClient;


    @Autowired
    private EmployeeMapper employeeMapper;

    /**
     * 分页方法，高级查询，关联。
     * @param query
     * @return
     */
    @Override
    public PageList<Tenant> searchTenant(TenantQuery query) {

        //分页,使用拦截器来实现。
        Page<Tenant> page = new Page<Tenant>(query.getPage(),query.getRows());
        //高级查询。
        List<Tenant> list = tenantMapper.searchTenant(page,query);

        return new PageList<>(page.getTotal(),list);
    }

    /**
     * 店铺入驻
     * @param tenantRegsigterDto
     * @return
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public AjaxResult entering(TenantRegsigterDto tenantRegsigterDto) {
        //t_login_user表，账号密码表，
        LoginUser loginUser = new LoginUser();
        //把前端传来的MealId，set赋值给封装对象。
        loginUser.setMealId(tenantRegsigterDto.getMealId());
        //封装基本信息,获取到前端传来的三个数据包中其中一个，使用实体类来接受。
        Employee employee = tenantRegsigterDto.getEmployee();
        loginUser.setUsername(employee.getUsername());
        loginUser.setPassword(employee.getPassword());
        //使用的接口常量写死了状态。
        loginUser.setType(LoginUserConstant.SUPER_ADMIN);
        //保存auth服务模块的相关信息。
        AjaxResult result = loginUserClient.entering(loginUser);
        //判断feign调用的结果。
        boolean flag = result.isSuccess();
        Date date = new Date();
        //保存auth成功再保存system。
        if (flag){
        employee.setInputTime(date); //设置时间。
        employee.setState(EmployeeConstant.ACTIVE); //设置状态，账户为正常。
        employee.setType(EmployeeConstant.TENANT_ADMIN);
        //获取auth保存的登录用户id。
            Integer lginId = (Integer) result.getResultObj();
            employee.setLoginId(Long.valueOf(lginId));
            employeeMapper.insert(employee);
            //保存tenant
            Tenant tenant = tenantRegsigterDto.getTenant();
            tenant.setAdminId(employee.getId());
            tenant.setState(TenantConstant.CHECK_WAITNG);
            tenantMapper.insert(tenant);
        }
        return result ;
    }
}
